package com.swa99ylum.pjv.sample.s02_validator.s0210;

import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Map.Entry;

import com.swa99ylum.pjv.Fuse;
import com.swa99ylum.pjv.PluggableJSONValidator;
import com.swa99ylum.pjv.bean.ArrayJSONNode;
import com.swa99ylum.pjv.bean.JSONNode;
import com.swa99ylum.pjv.sample.FileUtils;
import com.swa99ylum.pjv.validator.KeyGenerator;
import com.swa99ylum.pjv.validator.UniqueValidator;

/**
 * [测试]
 * UniqueValidator，唯一键 验证器：key 由 nodePath + nodeValue 拼接而成
 * 
 * [要求]
 * "宠物名称" 不能出现重复
 */
public class Test1 {
	public static void main(String[] args) throws Exception {
		String filePath = Test1.class.getResource("json_0210.txt").getPath();
		
		//step1、获取 json
		String json = null;
		try {
			json = FileUtils.getFileContent(filePath);
		} catch (Exception e) {
			System.err.println("从 文件中，读取 json 有误");
		}
		
		System.out.println(json);
		
		//step2、定义 json 的 nodeFrame
		@SuppressWarnings("serial")
		Map<String, Object[]> nodeFrame = new HashMap<String, Object[]>(){{
			put("$[A]", new Object[]{
					"name",
					new ArrayJSONNode("student")});
			
			put("$[A].student[A]", new Object[]{
					"name",
					new ArrayJSONNode("pet")});
			
			put("$[A].student[A].pet[A]", new Object[]{
					new JSONNode("name", new UniqueValidator(new KeyGenerator() {
						
						@Override
						public String generate(Object rootObject, String[] nodePath, String nodeName, Map<String, Object> parentValue, Object value) {
							//$[0].student[1].pet.name.阿福，单个 pet 节点下，"宠物名称"不能出现重复
//							String key = nodePath
//									.replaceAll("pet\\[(\\d+)\\]", "pet")
//									+ "." + value;
							
							//$[0].student.pet.name.阿福，单个 student 节点下，"宠物名称"不能出现重复
//							String key = nodePath
//									.replaceAll("pet\\[(\\d+)\\]", "pet")
//									.replaceAll("student\\[(\\d+)\\]", "student") 
//									+ "." + value;
//							
							//$.student.pet.name.阿福，root 节点下，"宠物名称"不能出现重复
//							String key = nodePath
//									.replaceAll("pet\\[(\\d+)\\]", "pet")
//									.replaceAll("student\\[(\\d+)\\]", "student") 
//									.replaceAll("\\$\\[(\\d+)\\]", "\\$") 
//									+ "." + value;
							
							//阿福，root 节点下，"宠物名称"不能出现重复
							String key = String.valueOf(value);
							
							return key;
						}
					})),
					"type"});
			
			
		}};
		
		//step3、定义 errorMap，用于存储 验证出来的 错误结果
		Map<String, String> errorMap = new LinkedHashMap<String, String>();
		
		//step4、验证 json
		new PluggableJSONValidator(json, nodeFrame, Fuse.ARRAY, errorMap).parse();
		
		for(Entry<String, String> entry : errorMap.entrySet()) {
			System.out.println(entry.getKey() + " => " + entry.getValue());
		}
		
		
	}
}
